/**
 * HMI 批量删除 API 模块
 *
 * 提供批量删除相关的 API 接口定义和数据类型
 * 遵循 Vue3 最佳实践，使用完整的 TypeScript 类型定义
 */

import request from "@/utils/request";
import qs from "qs";

const COMMON_BASE_URL = "/api";

/**
 * HMI 批量删除 API 接口
 */
export const HmiBatchDeleteAPI = {
  /**
   * 获取分页数据列表
   * @param baseUrl 基础 URL
   * @param queryParams 查询参数
   * @returns Promise<HmiBatchDeleteRow[]>
   */
  getList(baseUrl: string, queryParams: HmiBatchDeleteQueryParams) {
    return request<any, HmiBatchDeleteRow[]>({
      url: `${COMMON_BASE_URL}${baseUrl}?${qs.stringify(queryParams, {
        arrayFormat: "repeat",
      })}`,
      method: "get",
    });
  },

  /**
   * 批量删除数据
   * @param baseUrl 基础 URL
   * @param data 删除请求数据
   * @returns Promise<HmiBatchDeleteResponse[]>
   */
  batchDelete(baseUrl: string, data: HmiBatchDeleteRequest) {
    return request<any, HmiBatchDeleteResponse>({
      url: `${COMMON_BASE_URL}${baseUrl}`,
      method: "post",
      data,
    });
  },

  /**
   * 批量重置数据
   * @param baseUrl 基础 URL
   * @param data 重置请求数据
   * @returns Promise<HmiBatchResetResponse>
   */
  batchReset(baseUrl: string, data: HmiBatchResetRequest) {
    return request<any, HmiBatchResetResponse>({
      url: `${COMMON_BASE_URL}${baseUrl}`,
      method: "post",
      data,
    });
  },

  /**
   * 批量传动数据
   * @param baseUrl 基础 URL
   * @param data 传动请求数据
   * @returns Promise<HmiBatchTransResponse>
   */
  batchTrans(baseUrl: string, data: HmiBatchTransRequest[]) {
    return request<any, HmiBatchTransResponse>({
      url: `${COMMON_BASE_URL}${baseUrl}`,
      method: "post",
      data,
    });
  },

  // 批量对点
  batchPoint(baseUrl: string, data: HmiBatchPointRequest) {
    return request<any, HmiBatchPointResponse>({
      url: `${COMMON_BASE_URL}${baseUrl}`,
      method: "post",
      data,
    });
  },

  // 自动对点
  autoPoint(baseUrl: string, data: AutoPointPlayload) {
    return request<any, HmiAutoPointResponse>({
      url: `${COMMON_BASE_URL}${baseUrl}`,
      method: "post",
      data,
    });
  },

  /**
   * 下载数据
   * @param baseUrl 基础 URL
   * @param id 数据 ID
   * @returns Promise<Blob>
   */
  downloadData(baseUrl: string, id: number) {
    return request<any, Blob>({
      url: `${COMMON_BASE_URL}${baseUrl}/download/${id}`,
      method: "get",
      responseType: "blob",
    });
  },
};

// ==================== 类型定义 ====================

/**
 * 查询参数接口
 */
export interface HmiBatchDeleteQueryParams {
  /** 偏移量 */
  offset: number;
  /** 每页数量 */
  limit: number;
  /** 分组参数 */
  group: number[];
  /** 其他过滤条件 */
  filters?: Record<string, any>;
}

/**
 * 表格行数据接口
 */
export interface HmiBatchDeleteRow {
  /** 动态属性，支持任意字段 */
  [key: string]: any;
  /** 行索引，用于内部标识 */
  _index?: number;
}

/**
 * 批量删除请求接口
 */
export interface HmiBatchDeleteRequest {
  /** 删除的 ID 列表，key 由配置决定 */
  [key: string]: number[];
}

/**
 * 批量重置请求接口
 */
export interface HmiBatchResetRequest {
  /** 重置的 ID 列表，key 由配置决定 */
  [key: string]: number[];
}

/**
 * 批量传动请求接口
 */
export interface HmiBatchTransRequest {
  /** 传动数据，结构由配置决定 */
  [key: string]: any;
}

export interface HmiBatchPointRequest {
  /** 批量对点请求接口 */
  [key: string]: any;
}

export interface HmiBatchTransResponse {
  /** 批量传动响应接口 */
  [key: string]: any;
}

export interface HmiBatchResetResponse {
  /** 批量重置响应接口 */
  [key: string]: any;
}

export interface HmiBatchPointResponse {
  /** 批量对点响应接口 */
  [key: string]: any;
}

export interface HmiAutoPointResponse {
  /** 自动对点响应接口 */
  [key: string]: any;
}

/**
 * 操作响应接口
 */
export interface HmiBatchDeleteResponse {
  /** 操作是否成功 */
  success: boolean;
  /** 响应消息 */
  message?: string;
  /** 响应数据 */
  data?: any;
  /** 错误代码 */
  code?: number;
}

/**
 * 列配置接口
 */
export interface HmiBatchDeleteColumnConfig {
  /** 列字段名 */
  key?: string;
  /** 列显示标题 */
  label?: string;
  /** 列数据类型 */
  type?: "enum" | "number" | "string" | "boolean";
  /** 列索引 */
  index?: number;
  /** 列固定宽度 */
  width?: number;
  /** 列最小宽度 */
  minWidth?: number;
  /** 列对齐方式 */
  align?: "left" | "center" | "right";
  /** 是否显示 */
  show?: boolean;
  /** 保留小数位数 */
  fix?: number;
  /** 枚举类型选项配置 */
  enumOptions?: Array<{ value: any; label: string }>;
  /** 自定义格式化函数 */
  formatter?: (value: any, row: HmiBatchDeleteRow) => string;
}

/**
 * 批量删除配置接口
 */
export interface HmiBatchDeleteConfig {
  /** API 请求路径 */
  apiPath: string;
  /** 主键字段名 */
  idKey: string;
  /** 删除操作的 key */
  deleteKey?: string;
  /** post操作值的 key */
  updateValueKey?: string;
  /** 传动 API 路径 */
  transApi?: string;
  /** 自动对点API路径 */
  autoPointApi?: string;
  /** 传动请求体的 key 列表 */
  updateBodyKey?: string[];
  /** 传动请求体的固定配置 */
  updateBodyConfig?: Record<string, any>;
  /** 列配置数组 */
  columns: HmiBatchDeleteColumnConfig[];
  /** 功能开关配置 */
  features: {
    /** 是否支持新增 */
    isAdd?: boolean;
    /** 是否支持批量重置 */
    isBatchReset?: boolean;
    /** 是否支持批量删除 */
    isBatchDelete?: boolean;
    /** 是否支持批量传动 */
    isBatchTrans?: boolean;
    /** 是否支持下载 */
    isDownload?: boolean;
    /** 是否支持单行重置 */
    isReset?: boolean;
    /** 是否支持单行传动 */
    isTrans?: boolean;
    /** 是否支持单行删除 */
    isDelete?: boolean;
    /** 是否支持单个对点*/
    isPoint?: boolean;
    /** 是否支持批量对点*/
    isBatchPoint?: boolean;
  };
  /** 分页配置 */
  pagination?: {
    /** 每页显示条数 */
    pageSize: number;
    /** 是否显示页面大小选择器 */
    showSizeChanger?: boolean;
  };
  /** 排序的key */
  orderByKey?: string;
  /** 组 */
  group?: string;
}

/**
 * 组件事件接口
 */
export interface HmiBatchDeleteEmits {
  /** 数据加载完成事件 */
  "data-loaded": [data: HmiBatchDeleteRow[]];
  /** 选择变更事件 */
  "selection-change": [selection: HmiBatchDeleteRow[]];
  /** 行点击事件 */
  "row-click": [row: HmiBatchDeleteRow];
  /** 操作成功事件 */
  "operation-success": [type: string, data: any];
  /** 错误事件 */
  error: [error: Error];
}

/**
 * 组件属性接口
 */
export interface HmiBatchDeleteProps {
  /** 组件配置 */
  config?: HmiBatchDeleteConfig;
  /** 是否显示加载状态 */
  loading?: boolean;
  /** 是否显示工具栏 */
  showToolbar?: boolean;
  /** 是否显示操作列 */
  showActions?: boolean;
  /** 是否高亮当前行 */
  highlightCurrentRow?: boolean;
}

/**
 * [{
    "status":1
}]
 * AutoPointPlayload
 */
export interface AutoPointPlayload {
  status: number;
}
